package controller

import (
	"gitee.com/jiebaiyou/formflow/bootstrap"
	"gitee.com/jiebaiyou/formflow/model"
	"gitee.com/jiebaiyou/formflow/pkg/bizcode"
	"gitee.com/jiebaiyou/formflow/pkg/response"
	"github.com/gin-gonic/gin"
)

// RefreshTokenController 处理刷新令牌相关的HTTP请求
// 它依赖于RefreshTokenService接口来实现业务逻辑, 并使用环境配置来生成令牌
type RefreshTokenController struct {
	RefreshTokenService model.RefreshTokenService // 刷新令牌业务逻辑接口
	Env                 *bootstrap.Config         // 环境配置, 包含令牌密钥和过期时间等信息
}

// RefreshToken 处理刷新访问令牌的请求
func (rtc *RefreshTokenController) RefreshToken(c *gin.Context) {
	var request model.RefreshTokenRequest

	// 解析请求体并绑定到RefreshTokenRequest结构体
	err := c.ShouldBind(&request)
	if err != nil {
		// 如果请求格式不正确, 返回400错误
		response.BadRequest(c, bizcode.InvalidParams.String(), err)
		return
	}

	// 从刷新令牌中提取用户ID
	id, err := rtc.RefreshTokenService.ExtractIDFromToken(request.RefreshToken, rtc.Env.JWT.REFRESH_TOKEN_SECRET)
	if err != nil {
		// 如果令牌无效或已过期, 返回401未授权错误
		response.Unauthorized(c, bizcode.TokenInvalid.String(), err)
		return
	}

	// 根据提取的ID查找用户
	user, err := rtc.RefreshTokenService.GetUserByID(c, id)
	if err != nil {
		// 如果用户不存在, 返回401未授权错误
		response.Unauthorized(c, bizcode.UserNotFound.String(), err)
		return
	}

	// 创建新的访问令牌
	accessToken, err := rtc.RefreshTokenService.CreateAccessToken(&user, rtc.Env.JWT.ACCESS_TOKEN_SECRET, rtc.Env.JWT.ACCESS_TOKEN_EXPIRY_HOUR)
	if err != nil {
		// 如果创建令牌失败, 返回500服务器内部错误
		response.ServerError(c, bizcode.CreateAccessTokenFailed.String(), err)
		return
	}

	// 创建新的刷新令牌
	refreshToken, err := rtc.RefreshTokenService.CreateRefreshToken(&user, rtc.Env.JWT.REFRESH_TOKEN_SECRET, rtc.Env.JWT.REFRESH_TOKEN_EXPIRY_HOUR)
	if err != nil {
		// 如果创建刷新令牌失败, 返回500服务器内部错误
		response.ServerError(c, bizcode.CreateRefreshTokenFailed.String(), err)
		return
	}

	// 构建刷新令牌响应, 包含新的令牌对
	refreshTokenResponse := model.RefreshTokenResponse{
		AccessToken:  accessToken,
		RefreshToken: refreshToken,
	}

	// 返回成功响应和新的令牌对
	response.OK(c, bizcode.Success.String(), refreshTokenResponse)
}
